perm filename HASHCS.PAS[S1,ALS] blob
sn#419044 filedate 1979-02-16 generic text, type C, neo UTF8
COMMENT ā VALID 00004 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 (*PROGRAM HEADER PAGE*)
C00005 00003 program PRINTHASH (INPUT,OUTPUT)
C00008 00004 function CSP_HASH (var NAM : ALFA) : integer
C00017 ENDMK
Cā;
(*PROGRAM HEADER PAGE*)
(*PAS10 OPTIONS*) (*$D+,R32,S1300*) (*X10S1*)
(* DEFAULT
D+ DEBUG AND POSTMORTEM DUMP -
E+ EXTERNAL CALLS TO LEVEL 1 PROCEDURES ALLOWED -
Fn FILE OPTION 1
I+ FORTRAN I/O IN EXTERNAL FORTRAN SUBROUTINES -
L+ OBJECT LISTING -
Rn SIZE OF LOW-SEGMENT (SEE PAS10 MANUAL)
Sn MAX INSTRUCTIONS PER STATEMENT 1000
T+ RUNTIME CHECK +
U+ 72 COLUMN FORMAT -
Xn HIGHEST REGISTER FOR PARAMETERS 6
*)
(*SLAC PCPASC OPTIONS*) (* B+,D+,M-*)
(* DEFAULT
A+ GENERATE 370 OBJECT MODULE -
A- GENERATE 370 ASSEMBLY MODULE
B+ BOUNDS CHECKING, BUT ALLOW 'BIG' CHARACTERS -
C+ EMIT PCODE +
D+ RUNTIME CHECKING OF POINTER, INDEX, SUBRANGE VALUES -
E+ FILE IS IN EBCDIC CHARACTER SET -
F+ SAVE FPR'S ON PROCEDURE/FUNCTION ENTRY +
K+ ENABLE STATEMENT EXECUTION COUNTING -
L+ LIST SOURCE PROGRAM +
M+ 72 COLUMN FORMAT +
P+ DOUBLE-WORD BOUNDARY ALIGNMENT -
S+ SAVE GPR'S ON PROCEDURE/FUNCTION ENTRY +
T+ PRINT SYMBOL TABLES (FOR POST-PROCESSOR) -
U+ GET STATISTICS?? 2ND PARAMETER TO PCODE BGN INSTR. -
V+ ?? 3RD PCODE BGN INSTRUCTION PARAMETER -
X+ USE ACTUAL PROCEDURE NAMES FOR EXTERNAL REFERENCES -
X- GENERATE UNIQUE 8-CHAR NAMES FOR EXTERNAL REFERENCES
*)
(*S1 PCPASC OPTION DIFFERENCES*) (* A+,B+,D+,L-,M120*) (*X10S1*)
(* DEFAULT
A+ GENERATE S1 ASSEMBLY MODULE -
A- GENERATE S1 OBJECT MODULE
*)
(* SLAC/PDP-10 TRANSPORT DEPENDENCIES FLAGGED WITH "XSL10" *)
(* PDP-10/S-1 TRANSPORT DEPENDENCIES FLAGGED WITH "X10S1" *)
program PRINTHASH (INPUT,OUTPUT);
const
CSPHTSIZE = 91; (*prime*)
CSPHTSIZEM1 = 90;
type
CHAR3 = packed array [1..3] of char;
ALFALEN = 1..8;
ALFA = packed array [ALFALEN] of char;
NAMEREC = record NAM : ALFA; LEN : ALFALEN end;
P_STANDARDPROC = (
QATN, QCLK, QCOS, QEIO, QELN, QEOF, QEXP, QGET, QLOG, QNEW,
QPUT, QRDB, QRDC, QRDI, QRDR, QRDS, QRES, QREW, QRLN, QRST,
QSAV, QSIN, QSIO, QSQT, QTRP, QWLN, QWRB, QWRC, QWRI, QWRR,
QWRS, QXIT);
var
I : 0..CSPHTSIZEM1;
H : 0..CSPHTSIZEM1;
J : integer;
K : integer;
L1,L2,L3 : integer;
M1,M2,M3 : integer;
CSP : P_STANDARDPROC;
CSPHASHTAB : array [0..CSPHTSIZEM1] of
record
CSPNAM : NAMEREC;
CSP : P_STANDARDPROC;
(* HIT : integer *)
end (*CSPHASHTAB*);
function CSP_HASH (var NAM : ALFA) : integer;
begin
(* CSP_HASH := (ord(NAM[1])*676 + ord(NAM[2])*26 + ord(NAM[3])) *)
CSP_HASH := (ord(NAM[1])*M1 + ord(NAM[2])*M2 + ord(NAM[3])*M3)
mod CSPHTSIZE;
end (*CSP_HASH*);
procedure ENTER_CSP (NAM : CHAR3; CSP : P_STANDARDPROC);
var H : 0..CSPHTSIZEM1;
NAMALFA : ALFA;
begin
NAMALFA := ' ';
NAMALFA[1]:=NAM[1]; NAMALFA[2]:=NAM[2]; NAMALFA[3]:=NAM[3];
H := CSP_HASH(NAMALFA);
while CSPHASHTAB[H].CSPNAM.NAM <> ' ' do
begin
H := (H + 1) mod CSPHTSIZE;
J := J + 1;
(* K := 0;*)
end;
CSPHASHTAB[H].CSPNAM.NAM := NAMALFA;
CSPHASHTAB[H].CSPNAM.LEN := 3;
CSPHASHTAB[H].CSP := CSP;
(* CSPHASHTAB[H].HIT := K; *)
end (*ENTER_CSP*);
procedure PRINT_CSP;
var H : 0..CSPHTSIZEM1;
begin
WRITELN;
for H := 0 to CSPHTSIZEM1 do
begin
WRITE (OUTPUT,H,' ');
if CSPHASHTAB[H].CSPNAM.NAM = ' ' then WRITELN else
begin
WRITELN (OUTPUT,CSPHASHTAB[H].CSPNAM.NAM,CSPHASHTAB[H].CSP);
(* if CSPHASHTAB[H].HIT = 0 then WRITELN else
WRITELN (OUTPUT,CSPHASHTAB[H].HIT); *)
end;
end;
end;
begin (*MAIN PROGRAM*)
K := 1000;
M1 := 8;
while M1 < 1025 do
begin
M1 := M1*2;
M2 := 1;
while M2 < 129 do
begin
M2 := M2*2;
M3 := 0;
while M3 < 16 do
begin
M3 := M3+1;
for I := 0 to CSPHTSIZEM1 do
begin
CSPHASHTAB[I].CSPNAM.NAM := ' ';
CSPHASHTAB[I].CSPNAM.LEN := 1;
end;
J := 0;
ENTER_CSP ('ATN', QATN); ENTER_CSP ('EXP', QEXP);
ENTER_CSP ('SIN', QSIN); ENTER_CSP ('COS', QCOS);
ENTER_CSP ('LOG', QLOG); ENTER_CSP ('SQT', QSQT);
ENTER_CSP ('CLK', QCLK); ENTER_CSP ('XIT', QXIT);
ENTER_CSP ('TRP', QTRP); ENTER_CSP ('GET', QGET);
ENTER_CSP ('PUT', QPUT); ENTER_CSP ('RLN', QRLN);
ENTER_CSP ('WLN', QWLN); ENTER_CSP ('RES', QRES);
ENTER_CSP ('REW', QREW); ENTER_CSP ('RDC', QRDC);
ENTER_CSP ('RDI', QRDI); ENTER_CSP ('RDR', QRDR);
ENTER_CSP ('RDS', QRDS); ENTER_CSP ('WRC', QWRC);
ENTER_CSP ('RDB', QRDB); ENTER_CSP ('WRB', QWRB);
ENTER_CSP ('WRI', QWRI); ENTER_CSP ('WRR', QWRR);
ENTER_CSP ('WRS', QWRS); ENTER_CSP ('ELN', QELN);
ENTER_CSP ('EOF', QEOF); ENTER_CSP ('SIO', QSIO);
ENTER_CSP ('EIO', QEIO); ENTER_CSP ('NEW', QNEW);
ENTER_CSP ('SAV', QSAV); ENTER_CSP ('RST', QRST);
if J < K then
begin
K := J;
WRITELN (OUTPUT,M1,' M1',M2,' M2',M3,' M3',K,' K');
if K = 0 then PRINT_CSP;
end;
end;
end;
end;
end.